home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / pcl4c341.zip / MODEM_IO.C < prev    next >
Text File  |  1992-12-24  |  4KB  |  146 lines

  1. /*** MODEM_IO.C ***/
  2.  
  3. #include <stdio.h>
  4. #include "pcl4c.h"
  5. #include "ascii.h"
  6. #include "term.h"
  7.  
  8. #define FALSE 0
  9. #define TRUE !FALSE
  10. #define SECONDS 18
  11.  
  12. /* NOTE: Requires AT COMMAND SET for all functions in this file */
  13.  
  14. #if AT_COMMAND_SET
  15.  
  16. int SendTo(int,char *);
  17. int WaitFor(int,char *);
  18. void CmdState(int);
  19. void Hangup(int);
  20.  
  21. /*** send string to modem & get echo ***/
  22.  
  23. int SendTo(Port,String)
  24. int Port;       /* port to talk to */
  25. char *String;   /* string to send to mdoem */
  26. {int i;
  27.  char c;
  28.  int Code;
  29.  SioRxFlush(Port);
  30.  SioDelay(SECONDS/4);
  31.  for(i=0;i<strlen(String);i++)
  32.     {/* User BREAK ? */
  33.      if(BreakTest()) return(FALSE);
  34.      /* fetch character */
  35.      c = toupper( String[i] );
  36.      switch(c)
  37.         {case '!':
  38.             /* replace ! with carriage return */
  39.             c = CR;
  40.             break;
  41.          case '~':
  42.             /* delay 1/2 second */
  43.             SioDelay(SECONDS/2);
  44.             c = ' ';
  45.             break;
  46.          case ' ':
  47.             /* delay 1/4 second */
  48.             SioDelay(SECONDS/4);
  49.             break;
  50.         } /* end switch */
  51.      /* transmit as 7 bit character */
  52.      PutChar(Port,(char)(0x7f & c));
  53.      /* delay 3/18th of a second */
  54.      SioDelay(3);
  55.      /* wait up to 1 second for the echo */
  56.      Code = GetChar(Port,SECONDS);
  57.      if(Code>0) SioCrtWrite((char)Code);
  58.     }
  59.  return(TRUE);
  60. } /* end SendTo */
  61.  
  62. /*** wait for incoming string from modem ***/
  63.  
  64. int WaitFor(Port,String)
  65. int Port;       /* Port to talk to */
  66. char *String;   /* string to wait for */
  67. {int i, k;
  68.  char c;
  69.  int Code;
  70.  SioCrtWrite(LF);
  71.  /* flush leading LFs and CRs */
  72.  while(1)
  73.     {/* User BREAK ? */
  74.      if(BreakTest()) return(FALSE);
  75.      /* get next incoming character */
  76.      Code = GetChar(Port,2*SECONDS);
  77.         /* printf("{\n%x}",Code); */
  78.      if(Code==-1) break;
  79.      /* skip any leading CR or LF */
  80.      if(((char)Code!=LF)&&((char)Code!=CR))
  81.         {/* stuff character back & break out of loop */
  82.          SioUnGetc(Port,(char)Code);
  83.          break;
  84.         }
  85.      SioDelay(SECONDS/5);
  86.     }
  87.  /* wait for string */
  88.  for(i=0;i<strlen(String);i++)
  89.     {/* User BREAK ? */
  90.      if(BreakTest()) return(FALSE);
  91.      c = String[i];
  92.      /* wait up to 1 second for next character */
  93.      Code = GetChar(Port,SECONDS);
  94.         /* printf("(\n%x)",Code);*/
  95.      if(Code==-1) return(FALSE);
  96.      SioCrtWrite((char)Code);
  97.      if((char)Code != c)
  98.         {printf("\nExpecting %xH not %xH\n",c,Code);
  99.          return(FALSE);
  100.         }
  101.     } /* end for(i) */
  102.  /* another character ? */
  103.  Code = GetChar(Port,SECONDS);
  104.  if(Code>0) SioCrtWrite((char)Code);
  105.  return(TRUE);
  106. } /* end WaitFor */
  107.  
  108. /*** enter command state ***/
  109.  
  110. /* NOTE: assumes escape char = '+' & guard time = 1 sec */
  111.  
  112. void CmdState(Port)
  113. int Port;       /* Port to talk to */
  114. {int i;
  115.  /* delay a bit over 1 second */
  116.  SioDelay(20);
  117.  /* send Escape Code exactly 3 times */
  118.  for(i=0;i<3;i++)
  119.     {SioPutc(Port,'+');
  120.      SioDelay(4);
  121.     }
  122.  /* delay again */
  123.  SioDelay(16);
  124. } /* end CmdState */
  125.  
  126. /*** hangup phone (in command state) ***/
  127.  
  128. void Hangup(Port)
  129. int Port;       /* Port to talk to */
  130. {/* enter command state */
  131.  CmdState(Port);
  132.  /* hangup ! */
  133.  SendTo(Port,"!AT!");
  134.  SendTo(Port,"ATH0!");
  135. } /* end Hangup */
  136.  
  137. static int BreakTest()
  138. {/* User BREAK ? */
  139.  if(SioBrkKey())
  140.     {printf("User BREAK\n");
  141.      return(TRUE);
  142.     }
  143.  else return(FALSE);
  144. } /* end BreakTest */
  145. #endif
  146.